package com.w5cschool.reflect;

import lombok.Data;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author w5cSchool
 * @date 2021/11/7 17:51
 * description:
 */
public class 获取类对象设置属性和方法 {
    public static void main(String[] args) throws Exception  {
        // 通过反射获取类的class对象
        Class c1 = Class.forName("com.w5cschool.reflect.User");
        Class c2 = Class.forName("com.w5cschool.reflect.User");
        Class c3 = Class.forName("com.w5cschool.reflect.User");
        Class c4 = Class.forName("com.w5cschool.reflect.User");
        // 一个类在内存中只有一个class对象
        // 一个类被加载后，类的整个结构都会被封装在class对象中
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
        System.out.println(c3.hashCode());
        System.out.println(c4.hashCode());
        System.out.println("===========");
        User user1 = (User)c1.newInstance();
        System.out.println(user1);

        // 通过反射获取setName这个方法，并执行
        Method setName  = c1.getDeclaredMethod("setName", String.class);
        // 给user这个对象执行setName这个方法，参数为why。
        setName.invoke(user1,"why");
        System.out.println(user1.getName());

        // 通过反射获取属性，并设置属性
        User use2 = (User)c1.newInstance();
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);// 因为这个数据private的，所以需要把权限打开，才能设置
        name.set(use2,"hhh");
        System.out.println(use2.getName());

    }
}
@Data
class User{
    public User(){};
    private String name;
    private int age;
}